package pe.edu.upc.dsd.epica.serviceimp;

import java.util.List;
import javax.jws.WebService;
import javax.xml.soap.SOAPException;

import org.apache.log4j.Logger;

import pe.edu.upc.dsd.epica.dao.EstablecimientoDao;
import pe.edu.upc.dsd.epica.model.Establecimiento;
import pe.edu.upc.dsd.epica.model.ListaEstablecimiento;
import pe.edu.upc.dsd.epica.service.EstablecimientoService;

@WebService (endpointInterface = "pe.edu.upc.dsd.epica.service.EstablecimientoService")
public class EstablecimientoServiceImpl implements EstablecimientoService {
	
	EstablecimientoDao establecimientoDao;
	private final static Logger logger = Logger.getLogger(EstablecimientoServiceImpl.class);
	
	public void setEstablecimientoDao(EstablecimientoDao establecimientoDao) {
			this.establecimientoDao = establecimientoDao;	
	}
	
	@Override
	public void save(Establecimiento establecimiento) throws SOAPException {
		ValidatePromocionUsuario(establecimiento);
		try {			
			establecimientoDao.save(establecimiento);
		} catch (Exception e) {
			logger.error("Titulo:\nGuardar Establecimiento [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al guardar el establecimiento.");
		}		
	}

	@Override
	public void update(String codEstablecimiento,Establecimiento establecimiento) throws SOAPException {
		ValidatePromocionUsuario(establecimiento);
		try {			
			establecimientoDao.update(establecimiento);
		} catch (Exception e) {
			logger.error("Titulo:\nActualizar Establecimiento [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al actualizar el establecimiento.");
		}
		
	}

	@Override
	public void delete(String codEstablecimiento) throws SOAPException {
		if(codEstablecimiento == null)
		{
			throw new IllegalArgumentException("El codigo del establecimiento no puede ser nulo.");
		}
		
		try {
			establecimientoDao.delete(codEstablecimiento);
		} catch (Exception e) {
			logger.error("Titulo:\nEliminar Establecimiento [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al eliminar el establecimiento.");
		}
		
	}

	@Override
	public Establecimiento findByEstablecimientoCode(String codEstablecimiento) throws SOAPException {
		try {
			return establecimientoDao.findByEstablecimientoCode(codEstablecimiento);
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Establecimiento por codigo [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar el establecimiento.");
		}		
	}

	public Establecimiento findByUsuarioAndPassword(String login,String password) throws SOAPException {
		try {
			return establecimientoDao.findByUsuarioAndPassword(login, password);
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Establecimiento por Usuario y Password [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar el establecimiento.");
		}
		
	}

	//Criterio de aceptacion
	public ListaEstablecimiento findEstablecimientoWithPromocion(double longitud, double latitud) throws SOAPException {
		if(longitud == 0 || latitud == 0)
		{
			throw new IllegalArgumentException("No debe ingresar valores nulos.");
		}
		try {
			List<Establecimiento> listaArray= establecimientoDao.findEstablecimientoWithPromocion(longitud, latitud);
			
			ListaEstablecimiento listaEstab=new ListaEstablecimiento();
			listaEstab.setListaEstablecimientos(listaArray);
			
			return listaEstab;
			
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Establecimiento por Latitud y Longitud [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar el establecimiento.");
		}
		
	}
	
	//Criterio de aceptacion
	public ListaEstablecimiento findbyCategoriaPromNoVen(String categoria) throws SOAPException {
		if(categoria == "")
		{
			throw new IllegalArgumentException("No debe ingresar valores nulos.");
		}
		try {
			List<Establecimiento> listaArray=  establecimientoDao.findbyCategoriaPromNoVen(categoria);
			
			ListaEstablecimiento listaEstab=new ListaEstablecimiento();
			listaEstab.setListaEstablecimientos(listaArray);
			
			return listaEstab;
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Establecimiento con Promocions no vencidas por categoria [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar el establecimiento.");
		}		
	}	
	
	public List<Establecimiento> findbyPromNoVen() throws SOAPException {
		try {
			return establecimientoDao.findbyPromNoVen();
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Establecimiento con Promocions no vencidas [EstablecimientoService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar los  establecimientos.");
		}
		
	}
		
	private void ValidatePromocionUsuario(Establecimiento establecimiento)
	{
		if(establecimiento == null)
		{
			throw new IllegalArgumentException("El objeto establecimiento no puede ser nulo.");
		}
	}
}
